package com.test.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http

                .authorizeRequests()//这是一个方法链，用于配置请求的安全性。它表示开始对请求进行授权的配置。
                .anyRequest().authenticated()// 这表示对于任何请求，用户必须经过身份验证才能访问。也就是说，所有的请求都需要登录后才能访问，没有登录的用户将被重定向到登录页面。
                .and()
                .formLogin().permitAll(); // 使用表单登录
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        auth
                .inMemoryAuthentication()   // 直接创建一个用户，懒得搞数据库了
                .passwordEncoder(encoder)
                .withUser("wsy").password(encoder.encode("123456")).roles("admin");
    }

    @Bean   // 这里需要将AuthenticationManager注册为Bean，在OAuth配置中使用
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    @Override
    public UserDetailsService userDetailsServiceBean() throws Exception {
        return super.userDetailsServiceBean();
    }

    /***************************** JWT配置  ************************************/
    @Bean("tokenConverter")
    public JwtAccessTokenConverter tokenConverter(){  // Token转换器，将其转换为JWT
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("wsyKey");   // 这个是对称密钥，一会资源服务器那边也要指定为这个
        return converter;
    }

    @Bean
    public TokenStore tokenStore(@Qualifier("tokenConverter") JwtAccessTokenConverter converter){  // Token存储方式现在改为JWT存储
        return new JwtTokenStore(converter);  // 传入刚刚定义好的转换器
    }
}

